package com.cy;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**服务的消费方*/
@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class,args);
    }
    /**初始化RestTemplate对象(Spring提供)，基于此对象
     * 可以通过http协议调用远程服务*/
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /** @LoadBalanced描述RestTemplate时，底层再基于RestTemplate进行服务
     * 调用时，会被一个负载均衡拦截器进行拦截，然后再基于特定的负载均衡算法
     * 进行服务调用*/
//    @Bean
//    @LoadBalanced
//    public RestTemplate loadBalancedRestTemplate(){
//        return new RestTemplate();
//    }
    @Value("${spring.application.name}")
    private String applicationName;

    @Autowired
    private RestTemplate restTemplate;
//    @Autowired
//    private RestTemplate loadBalancedRestTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RestController
    public class ConsumerController{
//        @GetMapping("/consumer/doLoadBalanced")
//        public String doRestLoadBalancedEcho(){
//            //假如RestTemplate对象由LoadBalanced注解描述，在编写url时，应该用服务名替换ip和port
//            String url=String.format("http://%s/provider/echo/%s","nacos-provider",applicationName);
//            return loadBalancedRestTemplate.getForObject(url, String.class);
//        }

        @GetMapping("/consumer/findById")
        @SentinelResource("doFindById")
        public String doFindById(@RequestParam(value = "id",required = false) Integer id,
                                 @RequestParam(value = "name",required = false) String name){
            return "hot id is "+id;
        }

        @GetMapping("/consumer/doRestEcho")
        public String doRestEcho(){
            //基于服务名获取服务实例
            ServiceInstance serviceIntance =
                    loadBalancerClient.choose("nacos-provider");
            //获取实例对应的ip地址
            String host=serviceIntance.getHost();
            //获取实例对应的端口号
            int port=serviceIntance.getPort();
            //构建url
            String url=String.format("http://%s:%s/provider/echo/%s",
                    host,port,applicationName);
            //String url="http://"+host+":"+port+"/provider/echo/"+applicationName;
            //String url="http://localhost:8081/provider/echo/"+applicationName;
            System.out.println("url="+url);
            //return url;

            return restTemplate.getForObject(url, String.class);

        }
    }
}
